/* Copyright 2009 The Revere Group
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.wisco.plarform.core.base.dao.hibernate;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;

import com.wisco.plarform.dao.Page;

/**
 * Interface for a Data Access Object that can be used for a single specified
 * type domain object. A single instance implementing this interface can be used
 * only for the type of domain object specified in the type parameters.
 * 
 * @author dwolverton
 * 
 * @param <T>
 *            The type of the domain object for which this instance is to be
 *            used.
 * @param <ID>
 *            The type of the id of the domain object for which this instance is
 *            to be used.
 */
public interface GenericDAO<T, ID extends Serializable> {

	/**
	 * 查询操作
	 * @param hql
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List find(String hql);
	
	/**
	 * 根据条件查询
	 * @param hql
	 * @param param
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List findByArray(String hql, Object[] param);
	
	/**
	 * 根据条件查询
	 * @param hql
	 * @param params
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public List find(String hql, Object ... params);
	
	/**
	 * 获取所有实体集合
	 * @param entityClass 实体
	 * @return 集合
	 */
	@SuppressWarnings("rawtypes")
	public List findAll(Class entityClass);

	/**
	 * 
	 * @param object
	 * @return
	 */
	public Object insert(Object object);
	
	/**
	 * 
	 * @param entityClass
	 * @param id
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public Object get(Class entityClass,Serializable id);
	
	/**
	 * 
	 * @param entityClass
	 * @param id
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public Object load(Class entityClass,Serializable id);
	
	/**
	* 使用hql 语句进行操作    * @param hql
	* @param offset
	* @param length
	* @return List
	*/
	@SuppressWarnings("rawtypes")
	public List getListForPage(final String hql, final int offset,final int length);
	
	/**
	* 使用criterion进行操作
	* @param arg
	* @param criterions 
	* Restrictions
	* @param offset
	* @param length
	* @return List
	*/
	@SuppressWarnings("rawtypes")
	public List getListForPage(final Class entityClass, final Criterion[] criterions,final int offset, final int length);
	
	/**
	 * 查找指定ID实体类对象
	 * @param entityClass 实体Class
	 * @param id 实体ID
	 * @return 实体对象
	 */
	@SuppressWarnings("rawtypes")
	public Object findById(Class entityClass, Serializable id);
	
	/**
	 * 按照HQL语句查询唯一对象.
	 * @param hql HQL语句
	 * @param values 可变参数集合
	 * @return OBJECT对象
	 */
	public Object findUnique(final String hql, final Object... values);
	
	/**
	 * 查找指定HQL并返回INT型
	 * @param hql HQL语句
	 * @param values 可变参数列表
	 * @return INT
	 */
	public int findInt(final String hql, final Object... values);
	
	/**
	 * 获取指定实体Class指定条件的记录总数
	 * @param entityClass  实体Class
	 * @param where HQL的查询条件,支持参数列表
	 * @param values 可变参数列表
	 * @return 记录总数
	 */
	@SuppressWarnings("rawtypes")
	public int findTotalCount(Class entityClass, final String where,
			final Object... values) ;
	
	/**
	 * 获取指定实体Class的记录总数
	 * @param entityClass 实体Class
	 * @return 记录总数
	 */
	@SuppressWarnings("rawtypes")
	public int findTotalCount(Class entityClass);
	
	/**
	 * 查找指定属性的实体集合
	 * @param entityClass 实体
	 * @param propertyName 属性名
	 * @param value 条件
	 * @return 实体集合
	 */
	@SuppressWarnings("rawtypes")
	public List findByProperty(Class entityClass, String propertyName,
			Object value);
	
	/**
	 * 模糊查询指定条件对象集合 <br>
	 * 用法：可以实例化一个空的T对象，需要查询某个字段，就set该字段的条件然后调用本方法<br>
	 * 缺点：目前测试貌似只能支持String的模糊查询，虽然有办法重写，但没必要，其他用HQL<br>
	 * 
	 * @param entity 条件实体
	 * @return 结合
	 */
	@SuppressWarnings("rawtypes")
	public List findByExample(Object entity);
	
	/**
	 * 无视session的状态持久化对象
	 * @param entity 实体类
	 * @return 持久后的实体类
	 */
	public Object merge(Object entity);
	
	/**
	 * 清除实体的锁定状态
	 * @param entity 实体
	 */
	public void attachClean(Object entity);
	
	/**
	 * 按HQL分页查询.
	 * @param page 页面对象
	 * @param hql HQL语句
	 * @param values 可变参数列表
	 * @return 分页数据
	 */
	@SuppressWarnings("rawtypes")
	public Page findByPage(final Page page, final String hql,
			final Object... values);
	
	/**
	 * 执行存储过程，如果没有返回参数，outparamtype为null，如果没有输入参数，param不用传
	 */
	@SuppressWarnings("rawtypes")
	public List executeProduction(final String hql,final List<Integer> outParamType,final Object...param);
	
	
	/**
	 * 保存指定实体类
	 * @param entityobj 实体类
	 */
	public boolean save(Object entity);
	
	
	/**
	 * 更新或保存指定实体
	 * @param entity 实体类
	 */
	public void saveOrUpdate(Object entity);
	
	/**
	 * 根据查询条件与参数列表创建Query对象
	 * @param session Hibernate会话
	 * @param hql HQL语句
	 * @param objects 参数列表
	 * @return Query对象
	 */
	public Query createQuery(Session session, String hql, Object... objects);
	
	/**
	 * 删除指定实体
	 * @param entityobj 实体类
	 */
	public boolean delete(Object entity);
}
